package com.itheima.pool;


import com.itheima.utils.JDBCUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;

public class MyPool {
    private static LinkedList<Connection> pool = new LinkedList<Connection>();

    static {
        try {
            // 初始化连接
            for (int i = 0; i < 5; i++) {
                Connection conn = JDBCUtils.getConnection();
                pool.addLast(conn);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    //提供方法获取连接
    public static Connection getConnection() {
        System.out.println("获取前:" + pool.size());

        // 真实对象
        final Connection conn = pool.removeFirst();//返回第一个连接(对集合而言,删除并返回第一个)

        // 使用动态代理对Connection进行增强
        Connection proxy_conn = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if("close".equals(method.getName())){
                    // 是需要增强的方法(放回连接池中)
                    pool.addLast(conn);
                }else{
                    return method.invoke(conn,args);
                }
                return null;
            }
        });

        System.out.println("获取后:" + pool.size());
        return proxy_conn;
    }

    //提供方法归还连接
    public static void release(Connection conn) {
        pool.addLast(conn);
        System.out.println("归还以后:" + pool.size());
    }

}
